package heinstellungen

import java.util.logging.Logger;
import src.de.checker.hochzeit.util.*;
import src.de.checker.hochzeit.domain.util.*;
import src.de.checker.hochzeit.domain.user.*;
import src.de.checker.hochzeit.domain.ideen.*;
import src.de.checker.hochzeit.domain.hochzeit.*;
import src.de.checker.hochzeit.konstanten.*
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOptions.Builder.*

Logger log = Logger.getLogger('H_EinstellungenController');

if(session.getAttribute(Konstanten.SESSION_USER) != null)
{
	def user = session.getAttribute(Konstanten.SESSION_USER)

	if(params?.index ==~ /(?i)true/)
	{
		index()
	}
	if(params?.ben ==~ /(?i)true/)
	{
		benachrichtigung()
	}
	if(params?.updateben ==~ /(?i)true/)
	{
		updatebenachrichtigung()
	}
	if(params?.update ==~ /(?i)true/)
	{
		update()
	}
	if(params?.updateanspr ==~ /(?i)true/)
	{
		updateanspr()
	}
	
}
/**
 * Aktualisiert die Benachrichtigungsobjekte für den angemeldeten Benutzer
 */
private void updatebenachrichtigung()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	Key userkey = myuser.key 
	def query = new Query(Konstanten.BENACHRICHTIGUNG)
	query.addFilter("gast", Query.FilterOperator.EQUAL, userkey)
	PreparedQuery preparedQuery = datastore.prepare(query)
	def entities = preparedQuery.asList( withLimit(6) )
	if(entities == null)
	{
		log.warning('Keine Benachrichtigungs-Einträge für Gast '+myuser)
		forward '/heinstellungen/uebersicht.gtpl'
	}
	else if(entities.size() != 6)
	{
		log.warning('Falsche Anzahl ('+entities.size()+') der Benachrichtigungs-Einträge für Gast '+myuser)
	}
	else
	{
		boolean changedone = false
		for(i in entities)
		{
			String rvalue = "check_"+i.typ
			//System.out.println("params."+rvalue+": "+params[rvalue])
			boolean changed = false
			if(params[rvalue])
			{
				if(!i.wert)
				{
					i.wert = true
					changed = true
				}
			}
			else
			{
				if(i.wert)
				{
					i.wert = false
					changed = true
				}
			}
			if(i.typ == 6)
			{
				if(params['checktage'])
				{
					try
					{
						Long neuetage = new Long(params['checktage'])
						if(!(neuetage == i.tage))
						{
							i.tage = neuetage
							changed = true
						}
					}
					catch(Exception e){}
				}
			}
			if(changed)
			{
				i.save()
				changedone = true
			}
		}
		if(changedone)
			request.message = 'Benachrichtigungen erfolgreich aktualisiert '
			
	}
	request['list'] = entities
	
	forward '/heinstellungen/benachrichtigung.gtpl'
}
/**
 * Sucht die zum angemeldeten Benutzer gehörigen Benachrichtigungsobjekte
 */
private void benachrichtigung()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	Key userkey = myuser.key 
	def query = new Query(Konstanten.BENACHRICHTIGUNG)
	query.addFilter("gast", Query.FilterOperator.EQUAL, userkey)
	PreparedQuery preparedQuery = datastore.prepare(query)
	def entities = preparedQuery.asList( withLimit(6) )
	if(entities == null)
	{
		log.warning('Keine Benachrichtigungs-Einträge für Gast '+myuser)
		forward '/heinstellungen/uebersicht.gtpl'
	}
	else if(entities.size() != 6)
	{
		log.warning('Falsche Anzahl ('+entities.size()+') der Benachrichtigungs-Einträge für Gast '+myuser)
	}
	request['list'] = entities
	forward '/heinstellungen/benachrichtigung.gtpl'
	
}
/**
 * Aktualisiert die Ansprechpartner für die Hochzeit, die auf der Startseite
 * angezeigt werden
 */
private void updateanspr()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	String feier = myuser.feier
	//System.out.println(params)
	if(!params.name)
		request.message = 'Der Name des Ansprechpartners muss angegeben werden'
	else
	{
		if(params.add)
		{
			Ansprechpartner a = new Ansprechpartner()
			a.feier = feier
			a.name = params.name
			a.email = params.email
			a.emailAnzeigen = true
			a.telefon = params.telefon
			a.telefonAnzeigen = true
			a.handy = params.handy
			a.handyAnzeigen = true
			
			def e = a as Entity
			e.save()
			request.message = 'Ansprechpartner '+a.name+' hinzugefügt'
		}
		if(params.update)
		{
			try
			{
				Key target = KeyFactory.stringToKey(params.key)
				Entity a = datastore.get(target);
				if(a.feier.equals(feier))
				{
					a.name = params.name
					a.email = params.email
					a.emailAnzeigen = true
					a.telefon = params.telefon
					a.telefonAnzeigen = true
					a.handy = params.handy
					a.handyAnzeigen = true
					a.save()
					request.message = 'Ansprechpartner '+a.name+' geändert'
				}
				else
				{
					log.warning("Der Ansprechpartner gehört nicht zur eigenen Feier. Das sollte nicht passieren. ")
				}
			}
			catch(Exception e)
			{
				log.warning("FEHLER beim Update des Ansprechpartners zur Hochzeit "+feier)
				log.warning(e.toString())
			}
		}
		if(params.delete)
		{
			try
			{
				Key target = KeyFactory.stringToKey(params.key)
				target.delete()
				request.message = 'Ansprechpartner gelöscht'
			}
			catch(Exception e)
			{
				log.warning("FEHLER beim Löschen des Ansprechpartners zur Hochzeit "+feier)
				log.warning(e.toString())
			}
		}
		try
		{
			def query1 = new Query(Konstanten.ANPRECHPARTNER)
			query1.addFilter("feier", Query.FilterOperator.EQUAL, feier)
			PreparedQuery preparedQuery1 = datastore.prepare(query1)
			def entities = preparedQuery1.asList( withLimit(20) )
			session.setAttribute Konstanten.SESSION_ANSP, entities
		}
		catch(Exception e){e.printStackTrace()}
		
	}
	index()
}
/**
 * Aktualisiert die Daten des Hochzeitsobjekt, dass zu der
 * feier des angemeldeten Benutzers passt 
 */
private void update()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	String feier = myuser.feier
	
	def query = new Query(Konstanten.HOCHZEIT)
	query.addFilter("feier", Query.FilterOperator.EQUAL, feier)
	PreparedQuery preparedQuery = datastore.prepare(query)
	Entity entity = preparedQuery.asSingleEntity()
	if(!entity)
	{
		log.warning("Eigentlich sollte hier schon eine Entity exitieren")
		entity = createHochzeit()
	}
	entity.terminStandesamt = Datehelper.string2Date(params.terminStandesamt,"dd.MM.yyyy HH:mm")
	entity.ortStandesamt = params.ortStandesamt
	entity.terminZeremonie = Datehelper.string2Date(params.terminZeremonie,"dd.MM.yyyy HH:mm")
	entity.ortZeremonie = params.ortZeremonie
	entity.geistlicher = params.geistlicher
	entity.terminFeier = Datehelper.string2Date(params.terminFeier,"dd.MM.yyyy HH:mm")
	entity.ortFeier = params.ortFeier
	//entity.ausrichtung = params.ausrichtung
	entity.ueberschrift = params.ueberschrift
	entity.save()
	try
	{
       session.setAttribute Konstanten.SESSION_HOCHZEIT, entity
	}
	catch(Exception e){e.printStackTrace()}
	    
	request.message = 'Hochzeitsdaten aktualisiert'
	request['item'] = entity
	forward '/heinstellungen/uebersicht.gtpl'
}
/**
 * Sucht das Hochzeitsobjekt zum angemeldeten Benutzer
 */
private void index()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	String feier = myuser.feier
	
	def query = new Query(Konstanten.HOCHZEIT)
	query.addFilter("feier", Query.FilterOperator.EQUAL, feier)
	PreparedQuery preparedQuery = datastore.prepare(query)
	Entity entity = preparedQuery.asSingleEntity()
	if(!entity)
	{
		entity = createHochzeit()
	}
	request['item'] = entity
	
	def query1 = new Query(Konstanten.ANPRECHPARTNER)
	query1.addFilter("feier", Query.FilterOperator.EQUAL, feier)
	PreparedQuery preparedQuery1 = datastore.prepare(query1)
	def entities = preparedQuery1.asList( withLimit(20) )
	request['ap'] = entities
	
	forward '/heinstellungen/uebersicht.gtpl'
}
private Entity createHochzeit()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	String feier = myuser.feier
	if(myuser.rolle == 0)
	{
		log.info("Erstelle Eintrag für die Feier von "+myuser)
		Hochzeit h = new Hochzeit()
		h.feier = feier
		h.ortStandesamt = ''
		h.ortFeier = ''
		h.ortZeremonie = ''
		h.geistlicher = ''
		h.ueberschrift = 'Willkommen beim Hochzeitsplaner'
		def e = h as Entity
		e.save()
		return e
	}
	else
	{
	     String message =  'Dieser Benutzer hat versucht ein Hochzeit-Objekt anzulegen obwohl er nicht die Rolle Brautpaar hat'
	     createTracer(Konstanten.TRACER_VERBOTEN, message)
	     log.warning("Eintrag für Feier von "+myuser+" versucht zu erstellen. Ist aber nicht in der Rolle (0)")
		 return null;
	}
}

private void createTracer(String message)
{
	createTracer(Konstanten.TRACER_FORGOT, message);
}
private void createTracer(String type, String message) {
	try
	{
		def myuser = session.getAttribute(Konstanten.SESSION_USER);

		Tracer t = new Tracer()
	    t.ipadresse = request.getRemoteAddr()
	    t.user = myuser.key
	    t.type = type
	    t.nachricht = message
	    t.datum = Datehelper.getNow()
	    Entity e2 = t as Entity
		e2.save()
	}
	catch(Exception e)
	{
		
	}
}